package com.czxy.changgou3.com.czxy.changgou3.service;

import com.alibaba.fastjson.JSON;
import com.czxy.changgou3.com.czxy.changgou3.mapper.*;
import com.czxy.changgou3.pojo.*;
import com.czxy.changgou3.vo.ESData;
import com.czxy.changgou3.vo.OneSkuResult;
import com.czxy.vo.BaseResult;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhangmengxiang1@itcast.cn
 * @version 1.0
 * @date 2020/4/23
 */
@Service
@Transactional
public class SkuService {

    @Resource
    private SkuMapper skuMapper;

    @Resource
    private SkuCommentMapper skuCommentMapper;

    @Resource
    private SpuMapper spuMapper;

    @Resource
    private CategoryMapper categoryMapper;

    @Resource
    private SkuPhotoMapper skuPhotoMapper;

    @Resource
    private SpecificationMapper specificationMapper;

    /**
     * 查询所有的sku
     * @return
     */
    public List<ESData> findAllSku(){
        //1 查询
        List<Sku> list = skuMapper.findAllSku();

        //2 数据封装
        // 2.1 提供集合存放封装数据
        List<ESData> returnList = new ArrayList<>();
        // 2.2 遍历查询结果，将数据封装到ESData
        for (Sku sku : list) {
            // 1) 创建ESData
            ESData esData = new ESData();
            // 2) 依次封装数据
            esData.setId( sku.getId() );
            esData.setLogo( sku.getSpu().getLogo() );
            esData.setSkuName( sku.getSkuName() );
            //所有需要被搜索的信息，“sku名称 + 规格列表 + 品牌”
            esData.setAll(sku.getSkuName() + sku.getSpecInfoIdTxt() + sku.getSpu().getBrand().getBrandName());
            esData.setOnSaleTime( sku.getSpu().getOnSaleTime());
            esData.setBrandId( sku.getSpu().getBrandId() );
            esData.setCatId( sku.getSpu().getCat3Id());
            Map specMap = JSON.parseObject(sku.getSpecInfoIdTxt(), Map.class);
            esData.setSpecs(specMap);
            esData.setPrice( sku.getPrice() );
            esData.setStock( sku.getStock() );
            esData.setDescription( sku.getSpu().getDescription() );
            esData.setPackages( sku.getSpu().getPackages() );
            esData.setAftersale( sku.getSpu().getAftersale() );

            //评论数
            Integer count = skuCommentMapper.findNumBySpuId(sku.getSpuId());
            esData.setCommentCount( count );
            esData.setSellerCount( 10 );


            // 3) 将ESData添加集合中
            returnList.add(esData);
        }

        return returnList;
    }


    /**
     * 查询详情
     * @param skuId
     * @return
     */
    public OneSkuResult findSkuById(Integer skuId){
        //创建封装对象
        OneSkuResult oneSkuResult = new OneSkuResult();
        //封装数据
        //2.1 sku 基本信息(商品)
        Sku sku = skuMapper.selectByPrimaryKey(skuId);
        oneSkuResult.setSkuid(sku.getId());
        oneSkuResult.setSpuid(sku.getSpuId());
        oneSkuResult.setGoodsName(sku.getSkuName());
        oneSkuResult.setPrice(sku.getPrice());
        oneSkuResult.setStock(sku.getStock());

        //spu 基本信息
        Spu spu = spuMapper.findById(sku.getSpuId());
        oneSkuResult.setOnSaleDate(spu.getOnSaleTime());
        oneSkuResult.setDescription(spu.getDescription());
        oneSkuResult.setAftersale(spu.getAftersale());

        //评论
        Integer commentCount = skuCommentMapper.findNumBySkuId(skuId);
        Double commentLevel = skuCommentMapper.findAvgStarBySkuId(skuId);
        oneSkuResult.setCommentCount(commentCount);
        oneSkuResult.setCommentLevel(commentLevel);

        //三级
        Category category1 = categoryMapper.selectByPrimaryKey(spu.getCat1Id());
        Category category2 = categoryMapper.selectByPrimaryKey(spu.getCat2Id());
        Category category3 = categoryMapper.selectByPrimaryKey(spu.getCat3Id());

        oneSkuResult.setCat1Info(category1);
        oneSkuResult.setCat2Info(category2);
        oneSkuResult.setCat3Info(category3);

        //图片--需求已组体现，每组3张图片 (大中小)
        //第一张组图片 -- spu中的logo字段
        Map<String,String> logoMap = new HashMap<>();
        logoMap.put("smlogo",spu.getLogo());
        logoMap.put("biglogo",spu.getLogo());
        logoMap.put("xbiglogo",spu.getLogo());
        oneSkuResult.setLogo(logoMap);

        //其他组图片 -- sku_photo
        List<SkuPhoto> photoList = skuPhotoMapper.findSkuPhotoBySkuId(skuId);
        List<Map> phtots = new ArrayList<>();
        for (SkuPhoto skuPhoto : photoList) {
            Map<String, String> logoMap2 = new HashMap<>();
            logoMap2.put("sming",skuPhoto.getUrl());
            logoMap2.put("bigimg",skuPhoto.getUrl());
            logoMap2.put("xbigimg",skuPhoto.getUrl());
            phtots.add(logoMap2);
        }
        oneSkuResult.setPhotos(phtots);

        //2.6 处理spu对应的所有规格
        List<Specification> allspec = specificationMapper.findAll(spu.getCat3Id());
        oneSkuResult.setSpecList(allspec);

        //2.7 当前sku对应规格信息
        Map<String,String> specMap = new HashMap<>();
        specMap.put("id_list",sku.getSpecInfoIdList());
        specMap.put("id_txt",sku.getSpecInfoIdTxt());
        oneSkuResult.setSpecInfo(specMap);

        //2.8 所有sku对应的信息
        List<Sku> allSku = skuMapper.findSkuBySpuId(sku.getSpuId());
        List<Map<String,String>> skuList = new ArrayList<>();
        for (Sku tempsku : allSku) {
            HashMap<String, String> tempMap = new HashMap<>();
            tempMap.put("skuid",tempsku.getId()+"");
            tempMap.put("id_list",tempsku.getSpecInfoIdList());
            skuList.add(tempMap);
        }
        oneSkuResult.setSkuList(skuList);

        //返回
        return oneSkuResult;
    }

    /**
     * 更新商品数量
     * @param skuid
     * @param count
     */
    public void  updateSkuNum(Integer skuid,Integer count){
        Sku sku = skuMapper.selectByPrimaryKey(skuid);
        sku.setStock(sku.getStock() - count);
        skuMapper.updateByPrimaryKey(sku);
    }


}
